package com.junjiao.util.java;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Date;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;

/**
 * poi Excel工具类处理
 * <p>
 * 可参考：http://blog.csdn.net/xjun15/article/details/5805429
 * </p>
 * 
 * @author jiaojun [junjiao.j@gmail.com]
 * @project：2car interface
 * @version:v1.1
 * @date:2013-1-30
 */
public class ExcelUtils {

    /**
     * 创建Excel工作薄
     * 
     * @return
     */
    public static HSSFWorkbook createHSSFWorkbook() {
	// 创建Workbook对象（这一个对象代表着对应的一个Excel文件）
	HSSFWorkbook workbook = new HSSFWorkbook();
	return workbook;
	/**
	 * // 创建字体样式 HSSFFont font = wb.createFont();
	 * font.setFontName("Verdana"); font.setBoldweight((short) 100);
	 * font.setFontHeight((short) 300); font.setColor(HSSFColor.BLUE.index);
	 * 
	 * // 创建单元格样式 HSSFCellStyle style = wb.createCellStyle();
	 * style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
	 * style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
	 * style.setFillForegroundColor(HSSFColor.LIGHT_TURQUOISE.index);
	 * style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
	 * 
	 * // 设置边框 style.setBottomBorderColor(HSSFColor.RED.index);
	 * style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
	 * style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
	 * style.setBorderRight(HSSFCellStyle.BORDER_THIN);
	 * style.setBorderTop(HSSFCellStyle.BORDER_THIN);
	 * 
	 * style.setFont(font);// 设置字体
	 */
    }

    /**
     * 创建sheet
     * 
     * @param sheetName
     *            sheet名称
     * @return
     */
    public static HSSFSheet createHSSFSheet(HSSFWorkbook workbook,
	    String sheetName) {
	if (workbook == null) {
	    throw new IllegalArgumentException("parameter workbook is not null");
	}
	if (sheetName == null || sheetName.equals("")) {
	    throw new IllegalArgumentException(
		    "parameter sheetName is not null");
	}
	// 创建Sheet并给名字(表示Excel的一个Sheet)
	return workbook.createSheet(sheetName);
	/**
	 * // 设置excel每列宽度 sheet.setColumnWidth(0, 4000);
	 * sheet.setColumnWidth(1,3500);
	 */
    }

    /**
     * 填充表单内容
     * 
     * @param titles
     *            每行的内容，将数组切分后为列内容
     * @param rowIndex
     *            sheet的第rowIndex行
     */
    public static void fillSheetContent(HSSFSheet sheet, String[] titles,
	    int rowIndex) {
	if (sheet == null) {
	    throw new IllegalArgumentException("parameter sheet is not null");
	}
	if (titles == null) {
	    throw new IllegalArgumentException("parameter titles is not null");
	}
	HSSFRow row = sheet.createRow((short) rowIndex);
	if (titles != null) {
	    for (int i = 0; i < titles.length; i++) {
		// 创建每一列
		HSSFCell cell = row.createCell((short) i);
		cell.setCellValue(new HSSFRichTextString(titles[i]));
	    }
	}
    }

    /**
     * 填充表单内容
     * 
     * @param titles
     * @param rowIndex
     *            sheet的第rowIndex行
     */
    public static void fillSheetContent(HSSFCell cell, String content) {
	if (cell == null) {
	    throw new IllegalArgumentException("parameter cell is not null");
	}
	cell.setCellValue(new HSSFRichTextString(content));
    }

    /**
     * 利用poi读取Excel文件,大数据量需控制内存溢出的问题
     * 
     * @param filePath
     *            excel文件路径
     * @throws IOException
     */
    public static void readExcel(String filePath) throws IOException {
	FileInputStream fis = new FileInputStream(new File(filePath)); // 根据excel文件路径创建文件流
	POIFSFileSystem fs = new POIFSFileSystem(fis); // 利用poi读取excel文件流
	HSSFWorkbook wb = new HSSFWorkbook(fs); // 读取excel工作簿
	HSSFSheet sheet = wb.getSheetAt(0); // 读取excel的sheet，0表示读取第一个、1表示第二个
	for (int i = 0; i < sheet.getPhysicalNumberOfRows(); i++) {// 获取sheet中总共有多少行数据sheet.getPhysicalNumberOfRows()
	    HSSFRow row = sheet.getRow(i + 1); // 取出sheet中的某一行数据，之所以+1，是一般excel中的第一行为表头
	    if (row != null) {
		for (int j = 0; j < row.getLastCellNum(); j++) {// 获取该行中总共有多少列数据row.getLastCellNum()
		    HSSFCell cell = row.getCell((short) j); // 获取该行中的一个单元格对象
		    // 判断单元格数据类型，这个地方值得注意：当取某一行中的数据的时候，需要判断数据类型，否则会报错
		    // java.lang.NumberFormatException: You cannot get a string
		    // value from a numeric cell等等错误
		    if (cell != null) {
			String cellvalue = "";
			// 判定当前Cell的Type
			switch (cell.getCellType()) {
			// 假如当前Cell的Type为NUMERIC
			case HSSFCell.CELL_TYPE_NUMERIC: {
			    // 判定当前的cell是否为Date
			    if (HSSFDateUtil.isCellDateFormatted(cell)) {

				// 假如是Date类型则，取得该Cell的Date值

				Date date = cell.getDateCellValue();

				// 把Date转换本钱地格式的字符串

				cellvalue = cell.getDateCellValue()
					.toLocaleString();

			    }
			    // 假如是纯数字
			    else {
				// 取得当前Cell的数值
				Integer num = new Integer((int) cell
					.getNumericCellValue()); // 一般的数据类型在excel中读出来都为float型
								 // Math.round(cell.getNumericCellValue()))
				cellvalue = String.valueOf(num);
			    }
			    break;
			}
			    // 假如当前Cell的Type为STRIN
			case HSSFCell.CELL_TYPE_STRING:
			    // 取得当前的Cell字符串
			    cellvalue = cell.getStringCellValue();
			    break;
			// 默认的Cell值
			default:
			    cellvalue = " ";
			}
		    }
		}
	    }
	 }
    }

    /**
     * 保存Excel文件
     * 
     * @param filePath
     *            文件路径
     */
    public static void saveExcel(HSSFWorkbook workbook, String filePath) {
	if (workbook == null) {
	    throw new IllegalArgumentException("parameter workbook is not null");
	}
	if (filePath == null || filePath.equals("")) {
	    throw new IllegalArgumentException("parameter filePath is not null");
	}
	OutputStream out = null;
	try {
	    out = new FileOutputStream(new File(filePath));
	    workbook.write(out);
	    out.close();
	} catch (FileNotFoundException e) {
	    throw new RuntimeException(e.getMessage(), e);
	} catch (IOException e) {
	    throw new RuntimeException(e.getMessage(), e);
	} finally {
	    if (out != null) {
		try {
		    out.close();
		} catch (IOException e) {
		    throw new RuntimeException(e.getMessage(), e);
		}
	    }
	}
    }

    public static void main(String[] args) {
	try {
	    readExcel("C:/Users/51auto/Desktop/1.xls");
	} catch (IOException e) {
	    e.printStackTrace();
	}
    }
}
